// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-08-16

package gen_model

import (
	"context"
	_ "embed"
	"fmt"
	"gitee.com/go-libs/console"
	"gitee.com/go-libs/db-xorm/db/commands"
	"gitee.com/go-libs/db-xorm/db/commands/base"
)

//go:embed generator.tpl
var template string

// Generator
// is a component for generate model files.
type Generator struct {
	Common    *commands.Common
	Command   *console.Command
	Container *console.Container
	Table     *base.Table
	Target    base.Target
}

func (o *Generator) Run(ctx context.Context) (err error) {
	var can bool

	// Build
	// a path for service file.
	o.Target = base.Target(
		fmt.Sprintf(`%s/%s/model_%s.go`,
			o.Common.BaseDir,
			o.Common.TargetPath,
			o.Table.Name.FileName(o.Common.Prefix),
		),
	)

	// Override
	// state check for target file.
	if can, err = o.Target.Can(o.Common.Override); err != nil {
		return err
	}

	// Return
	// for service file existing and not allow override.
	if !can {
		o.Container.GetOutput().Info(`  [ignored] %s`, o.Target)
		return
	}

	// Generate related fields.
	o.Common.FormatTableAsModel(o.Table)

	o.Table.Ready()

	// Save
	// generated result.
	if err = o.Target.Save(ctx, template, o.Table); err != nil {
		return
	}

	// Generate success.
	o.Container.GetOutput().Info(`  [succeed] %s`, o.Target)
	return
}
